import type { FormConfig } from '@/types/dynamic-form';

export const createMenuFormConfig = (menuTreeData: any[], isEdit: boolean = false): FormConfig => ({
  key: 'menu-form',
  title: isEdit ? '编辑菜单' : '新增菜单',
  description: isEdit ? '修改菜单信息' : '添加新的菜单项',
  layout: 'vertical',
  labelAlign: 'left',
  requiredMark: true,
  initialValues: isEdit ? {} : {
    visible: true,
    status: true,
    sort: 0,
  },
  sections: [
    {
      key: 'basic',
      title: '基本信息',
      fields: [
        ...(isEdit ? [{
          key: 'id',
          label: 'ID',
          type: 'input',
          hidden: true,
        }] : []),
        {
          key: 'pid',
          label: '上级菜单',
          type: 'tree-select',
          placeholder: '请选择上级菜单',
          required: true,
          treeData: [
            {
              title: '顶级菜单',
              value: 0,
              key: 0,
              children: menuTreeData,
            },
          ],
          allowClear: true,
          showSearch: true,
          treeDefaultExpandAll: true,
          treeNodeFilterProp: 'title',
        },
        {
          key: 'type',
          label: '菜单类型',
          type: 'select',
          placeholder: '请选择菜单类型',
          required: true,
          shouldUpdate: true,
          options: [
            { label: '目录', value: 'M' },
            { label: '菜单', value: 'C' },
            { label: '按钮', value: 'F' },
          ],
        },
        {
          key: 'name',
          label: '菜单名称',
          type: 'input',
          placeholder: '请输入菜单名称',
          required: true,
          rules: [
            { required: true, message: '请输入菜单名称' },
            { min: 2, max: 50, message: '菜单名称长度在2-50个字符之间' },
          ],
        },
        {
          key: 'sort',
          label: '显示排序',
          type: 'number',
          placeholder: '请输入显示排序',
          required: true,
          min: 0,
          max: 999,
          defaultValue: 0,
        },
      ],
      col: 2,
      gutter: 16,
    },
    // 动态路由配置区域 - 根据菜单类型显示不同字段
    {
      key: 'route-config',
      title: '路由配置',
      condition: (values) => values.type !== 'F', // 按钮类型不显示路由配置
      shouldUpdate: (prevValues, currentValues) => prevValues.type !== currentValues.type,
      fields: (values) => {
        const fields = [];

        // 图标字段（目录和菜单类型显示）
        if (values.type === 'M' || values.type === 'C') {
          fields.push({
            key: 'icon',
            label: '图标',
            type: 'icon-select',
            placeholder: '请选择图标',
            tooltip: '从Ant Design图标库中选择图标',
            allowClear: true,
          });
        }

        // 路由地址字段（目录和菜单类型显示）
        if (values.type === 'M' || values.type === 'C') {
          fields.push({
            key: 'path',
            label: '路由地址',
            type: 'input',
            placeholder: values.type === 'M' ? '请输入路由地址（如：/system）' : '请输入路由地址（如：/system/menu）',
            required: true,
            rules: [
              { required: true, message: '请输入路由地址' },
              { pattern: /^\/[a-zA-Z0-9-_/]*$/, message: '路由地址格式不正确' },
            ],
          });
        }

        // 组件路径字段（仅菜单类型显示）
        if (values.type === 'C') {
          fields.push({
            key: 'component',
            label: '组件路径',
            type: 'input',
            placeholder: '请输入组件路径（如：pages/system/menu）',
            tooltip: '例如: pages/dashboard/Dashboard',
            required: true,
            rules: [
              { required: true, message: '请输入组件路径' },
            ],
          });
        }

        // 重定向地址字段（仅目录类型显示）
        if (values.type === 'M') {
          fields.push({
            key: 'redirect',
            label: '重定向地址',
            type: 'input',
            placeholder: '请输入重定向地址（如：/dashboard）',
            tooltip: '例如: /dashboard',
            required: true,
            rules: [
              { required: true, message: '请输入重定向地址' },
            ],
          });
        }

        return fields;
      },
      col: (values) => {
        // 根据字段数量动态调整列数
        const fieldCount = values.type === 'M' ? 3 : values.type === 'C' ? 3 : 0;
        return fieldCount > 0 ? Math.min(fieldCount, 2) : 1;
      },
      gutter: 16,
    },
    // 权限配置区域 - 所有类型都显示，但字段不同
    {
      key: 'permission-config',
      title: '权限配置',
      fields: (values) => {
        const fields = [];

        // 权限标识字段（所有类型都需要，但按钮类型是必填）
        fields.push({
          key: 'permission',
          label: '权限标识',
          type: 'input',
          placeholder: values.type === 'F' ? '请输入权限标识（如：system:menu:add）' : '请输入权限标识（如：system:menu:list）',
          tooltip: '例如: system:menu:list',
          required: values.type === 'F',
          rules: [
            { required: values.type === 'F', message: '请输入权限标识' },
          ],
        });

        // 显示状态字段（按钮类型不显示）
        if (values.type !== 'F') {
          fields.push({
            key: 'visible',
            label: '显示状态',
            type: 'switch',
            defaultValue: true,
            fieldProps: {
              checkedChildren: '显示',
              unCheckedChildren: '隐藏',
            },
          });
        }

        // 菜单状态字段（所有类型都显示）
        fields.push({
          key: 'status',
          label: '菜单状态',
          type: 'switch',
          defaultValue: true,
          fieldProps: {
            checkedChildren: '正常',
            unCheckedChildren: '停用',
          },
        });

        return fields;
      },
      col: (values) => {
        // 权限配置区域：按钮类型显示1个字段，其他显示2个字段
        return values.type === 'F' ? 1 : 2;
      },
      gutter: 16,
      shouldUpdate: (prevValues, currentValues) => prevValues.type !== currentValues.type,
    },
  ],
  submitButton: {
    text: '确定',
    type: 'primary',
  },
  cancelButton: {
    text: '取消',
    type: 'default',
  },
});